# -*- coding:utf-8 -*-

# 验证码:图片验证码，短信验证码
from . import api
# 将json字符串转为字典
from flask import request, abort, current_app, jsonify, make_response, json,session
from iHome.utils.captcha.captcha import captcha
from iHome import redis_store,db
from iHome import constants
from iHome.utils.response_code import RET
from iHome.models import User
# 用户登录才能退出，导入判断用户是否登录的装饰器
from iHome.utils.common import login_required

@api.route("/session")
def check_user_login():
    """判断用户是否登录
    如果登录返回登录的信息
    用户名：用户id"""
    user_id = session.get("user_id")
    name = session.get("name")
    return jsonify(errno=RET.OK, errmsg="ok", data={"user_id": user_id, "name": name})


@api.route("/session", methods=['DELETE'])
@login_required
def logout():
    # 清除用户登录信息
    session.pop("name", None)
    session.pop("mobile", None)
    session.pop("user_id", None)
    return jsonify(errno=RET.OK, errmsg="退出登录")


@api.route("/session", methods=['POST'])
def login():
    # 1.获取参数
    data_dict = request.json
    mobile = data_dict.get("mobile")
    password = data_dict.get("password")
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    # 2.找到对应的手机号用户
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据错误")
    if not user:
        return jsonify(errno=RET.DATAEXIST, errmsg="用户不存在")

    # 3.校验密码
    if not user.check_password(password):
        return jsonify(errno=RET.PWDERR, errmsg="用户名或密码错误")

    # 保存用户状态
    session['name'] = user.name
    session['mobile'] = user.mobile
    session['user_id'] = user.id

    # 5.返回结果
    return jsonify(errno=RET.OK, errmsg="登录成功")


# 实现登录注册的功能
@api.route("/users", methods=['POST'])
def register():
    """1.获取参数并判断是否有值
    2.取到本地的验证码
    3.将本地的验证码和船赌的短信验证码进行对比，如果一样
    4.创建用户模型，并设置数据，并添加到数据库
    5.返回结果"""
    # 1.获取参数并判断是否有值
    data_dict = request.get_json()
    mobile = data_dict.get('mobile')
    phonecode = data_dict.get('phonecode')
    password = data_dict.get('password')

    if not all([mobile, phonecode, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")

    # 2.取到本地的验证码
    try:
        sms_code = redis_store.get("SMS_"+mobile)
        redis_store.delete("SMS_"+mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="本地短信验证码获取失败")
    if not sms_code:
        return jsonify(errno=RET.NODATA, errmsg="短信验证码过期")


    # 3.将本地的验证码和船赌的短信验证码进行对比
    if phonecode != sms_code:
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")

    #初始化用化
    user = User(mobile=mobile, name=mobile)
    # 设置数据
    # user.name = mobile
    user.password = password

    # 保存用户数据
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

    # 保存登录状态
    session['name'] = mobile
    session['mobile'] = mobile
    session['user_id'] = user.id

    # 5.返回结果
    return jsonify(errno=RET.OK, errmsg="注册成功")